from biz.core.ai.models import RoadModel, LamppostModel
from typing import List
from langchain_core.tools import tool
from llama_index.core.tools import FunctionTool
from langchain_core.utils.function_calling import convert_to_openai_tool


@tool
def road_function(roadModelList: List[RoadModel]):
    """ 按道路进行开关灯。
    参数格式:{"roadModelList": [{"roadName": "道路名称", "roadSide": "", "dimmingValue": 100},{"roadName": "道路名称","dimmingValue": 0}]}
    """
    from biz.core.command.handler import Command
    init_message = "缺少道路名称或者调光值，请询问用户更多信息，引导用户输入道路名称和调光值"
    try:
        commandData = []
        for roadModel in roadModelList:
            if roadModel.roadName is None or roadModel.roadName == "" or roadModel.dimmingValue is None or roadModel.dimmingValue == "":
                return False, init_message
            commandData.append({
                "roadName": roadModel.roadName,
                "roadSide": roadModel.roadSide,
                "dimmingValue": roadModel.dimmingValue
            })

        if len(commandData) != 0:
            command = Command()
            return True, command.execution_command_road(commandData)
    except Exception as e:
        print(e)
        return False, init_message
    return False, init_message

@tool
def pole_function(lamppostModelList: List[LamppostModel]):
    """按灯杆编号进行开关灯。灯杆编号为必须输入参数！！
    参数格式:{"lamppostModelList": [{"lamppostCode": "灯杆编号", "dimmingValue": 调光值},{"lamppostCode": "灯杆编号", "dimmingValue": 调光值}]}
    示例：
    - **输入**：01到03号灯隔一亮一
    - **返回**：{"lamppostModelList": [{"lamppostCode": "01", "dimmingValue": 100},{"lamppostCode": "02", "dimmingValue": 0},{"lamppostCode": "03", "dimmingValue": 100}]}
    """
    from biz.core.command.handler import Command
    init_message = "缺少灯杆编号或者调光值，请询问用户更多信息，引导用户输入灯杆编号和调光值"
    try:
        commandData = []
        for lamppostModel in lamppostModelList:
            if lamppostModel.lamppostCode is None or lamppostModel.dimmingValue is None:
                return False, init_message
            commandData.append({
                "lamppostCode": lamppostModel.lamppostCode,
                "dimmingValue": lamppostModel.dimmingValue
            })
            # json_string = json.dumps(commandData)
            # res = command.execution_command(json_string)
            # return res
        if len(commandData) != 0:
            command = Command()
            return True, command.execution_command(commandData)
    except Exception as e:
        print("\033[91m" + e + "\033[0m")
        return False, init_message
    return False, init_message

@tool
def ask_for_more_info(question):
    """询问用户更多信息,对用户进行提问。参数question是字符串类型,格式：{"question": ".....？"} """
    return None



def menu(question: str) -> str:
    """适用于用户希望查看或操作系统的功能菜单的情况。
    参数：
        question (str): 用户的问题或要求。
    """
    from biz.core.functions import generate_command_core
    id, type, res = generate_command_core(question=question, type="router")
    return res

def knowledge_base(question: str) -> str:
    """适用于用户希望获取照明方面的知识或文档信息的情况。
    参数：
        question (str): 要查询的问题描述。
    """
    return question

def data_analysis(question: str, session_id: str) -> str:
    """适用于用户希望获取照明数据并进行分析的情况。
    参数：
        question (str): 用户的问题或要求。
        session_id (str): 会话ID，用于标识特定的用户会话。
    """
    from biz.core.functions import generate_sql_core
    id, sql = generate_sql_core(question, session_id)
    return sql

def light_control(question: str, session_id: str) -> str:
    """适用于用户希望对单灯进行调光的情况，不具有下发方案和计划功能。
    参数：
        question (str): 用户的问题或要求。
        session_id (str): 会话ID，用于标识特定的用户会话。
    """
    from biz.core.functions import generate_command_core
    id, type, res = generate_command_core(question=question, uuid=session_id, type="command")
    return res

def user_intent_analysis(confirmation_of_user_intent: str) -> str:
    """适用于对用户意图不确定的情况进行询问。
    参数：
        confirmation_of_user_intent (str): 用户意图确认信息。
    返回：
        confirmation_of_user_intent (str): 用户意图确认信息。
    """
    return confirmation_of_user_intent

def diagnosis_analysis(question: str) -> str:
    """适用于对设备故障进行分析诊断，一般需要用户确认后执行，会生成诊断报告。
    参数：
        question (str): 要诊断的详细信息描述。
    返回：
        confirmation_of_user_intent (str): 诊断报告。
    """
    from biz.core.functions import generate_diagnosis_core
    id, res = generate_diagnosis_core(question=question)
    return res

def end_conversation(feedback: str) -> str:
    """用户结束对话。
    参数：
        feedback (str): 给用户反馈的信息。
    返回：
        feedback (str): 给用户反馈的信息。
    """
    return feedback

def other(question: str) -> str:
    """适用于不能使用其他工具处理情况，以及不明白用户意图的所有情况。
    参数：
        question (str): 用户的问题或要求。
    """
    return """我可以帮您进行快捷跳转、知识问答、数据分析、设备控制相关的功能，不过现在信息有点不足。您能否再补充一些细节呢？"""

menu_tool = FunctionTool.from_defaults(fn=menu, return_direct=True)
knowledge_base_tool = FunctionTool.from_defaults(fn=knowledge_base, return_direct=True)
data_analysis_tool = FunctionTool.from_defaults(fn=data_analysis, return_direct=True)
light_control_tool = FunctionTool.from_defaults(fn=light_control, return_direct=False)
user_intent_analysis_tool = FunctionTool.from_defaults(fn=user_intent_analysis, return_direct=True)
end_conversation_tool = FunctionTool.from_defaults(fn=end_conversation, return_direct=True)
diagnosis_analysis_tool = FunctionTool.from_defaults(fn=diagnosis_analysis, return_direct=True)
other_tool = FunctionTool.from_defaults(fn=other, return_direct=True)
TOOLS_INTENT_ANALYSIS = [menu_tool,knowledge_base_tool,data_analysis_tool,light_control_tool,user_intent_analysis_tool,diagnosis_analysis_tool,end_conversation_tool]

tools = [road_function, pole_function, ask_for_more_info]
openai_tools = [convert_to_openai_tool(tool) for tool in tools]
tool_names = [i.name for i in tools]

def get_prefix() -> str:
    """获取格式化后的 PREFIX 提示词"""
    from biz.core.ai.prompts import PREFIX_TEMPLATE
    return PREFIX_TEMPLATE.format(
        openai_tools=openai_tools,
        tool_names=tool_names
    )
